package com.gjy.poi.pdf;

import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.element.*;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.UnitValue;

import java.io.IOException;

/**
 * @author gjy
 * @version 1.0
 * @since 2025-09-08 10:32:44
 */
public class ContractGenerator {
    private static final String PREFIX = "D:\\code\\java\\microservice_spc\\utils-all\\poi-all\\src\\main\\resources\\";

    /* 输出文件 */
    private static final String DEST = PREFIX + "pdf\\contract.pdf";

    /* 黑体字体文件（放在 resources 里） */
    private static final String FONT_PATH = PREFIX + "仿宋_GB2312.ttf";

    public static void main(String[] args) throws IOException {
        new ContractGenerator().generate();
        System.out.println("PDF 已生成：" + DEST);
    }

    private void generate() throws IOException {
        // 1. 初始化 PDF
        PdfDocument pdf = new PdfDocument(new PdfWriter(DEST));
        pdf.setDefaultPageSize(PageSize.A4);
        Document doc = new Document(pdf);

        // 2. 加载中文字体（支持嵌入）
        PdfFont font = PdfFontFactory.createFont(FONT_PATH, PdfEncodings.IDENTITY_H, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);

        // 3. 构建内容
        buildContent(doc, font);

        // 4. 关闭
        doc.close();
    }

    /* 拼装正文 */
    private void buildContent(Document doc, PdfFont font) {
        // 全局字体
        doc.setFont(font);

        // 标题
        Paragraph title = new Paragraph("劳动合同")
                .setFontSize(22)
                .setBold()
                .setTextAlignment(TextAlignment.CENTER)
                .setMarginBottom(30);
        doc.add(title);

        // 甲方乙方信息表格
        float[] colW = {80, 220, 80, 220};
        Table info = new Table(colW);
        info.setWidth(UnitValue.createPercentValue(100));

        info.addCell(cell("甲方（用人单位）", true));
        info.addCell(cell("北京科技有限公司", false));
        info.addCell(cell("地址", true));
        info.addCell(cell("北京市朝阳区科技园区88号", false));
        info.addCell(cell("法定代表人", true));
        info.addCell(cell("张三", false));
        info.addCell(cell("乙方（劳动者）", true));
        info.addCell(cell("李四", false));
        info.addCell(cell("身份证号", true));
        info.addCell(cell("110101199001011234", false));
        info.addCell(cell("住址", true));
        info.addCell(cell("北京市海淀区中关村大街100号", false));
        doc.add(info.setMarginBottom(20));

        // 条款
        doc.add(clause("第一条　合同期限", "本合同期限自 2024 年 1 月 1 日起至 2026 年 12 月 31 日止，为期 3 年。"));
        doc.add(clause("第二条　工作内容", "乙方同意根据甲方工作需要，担任软件工程师岗位，负责软件开发工作。"));
        doc.add(clause("第三条　劳动报酬", "甲方按月支付乙方工资，基本工资为人民币 15 000 元/月。"));
        doc.add(clause("第四条　工作时间", "甲方实行标准工时制度，乙方每日工作时间不超过 8 小时，每周不超过 40 小时。"));
        doc.add(clause("第五条　社会保险", "甲方依法为乙方缴纳养老、医疗、失业、工伤、生育等社会保险。"));
        doc.add(clause("第六条　劳动保护", "甲方为乙方提供符合国家规定的劳动安全卫生条件。"));
        doc.add(clause("第七条　合同解除", "经甲乙双方协商一致，可以解除本合同。"));
        doc.add(clause("第八条　争议解决", "因履行本合同发生的争议，双方应协商解决；协商不成的，可向劳动争议仲裁委员会申请仲裁。"));
        doc.add(clause("第九条　其他事项", "本合同未尽事宜，按国家有关法律法规执行。"));

        // 签名栏
        doc.add(signatureArea());

        // 页眉页脚
        // doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE)); // 如有多页可继续
    }

    /* 条款快捷构造 */
    private Paragraph clause(String head, String body) {
        return new Paragraph()
                .add(new Text(head).setBold())
                .add(new Text("　" + body).setFontSize(11))
                .setMarginBottom(12)
                .setFirstLineIndent(20);
    }

    /* 单元格快捷构造 */
    private Cell cell(String txt, boolean bold) {
        Cell c = new Cell().add(new Paragraph(txt).setFontSize(10));
        if (bold) c.setBold();
        c.setBorder(Border.NO_BORDER);
        c.setPadding(4);
        return c;
    }

    /* 签名区 */
    private Div signatureArea() {
        Div div = new Div().setMarginTop(40);
        Table sign = new Table(new float[]{1, 1});
        sign.setWidth(UnitValue.createPercentValue(100));
        sign.addCell(new Cell().setBorder(Border.NO_BORDER)
                .add(new Paragraph("甲方（盖章）：\n\n法定代表人（签字）：\n\n日期：2024年1月1日\n\n").setFontSize(11)));
        sign.addCell(new Cell().setBorder(Border.NO_BORDER)
                .add(new Paragraph("乙方（签字）：\n\n身份证号：110101199001011234\n\n日期：2024年1月1日\n\n").setFontSize(11)));
        div.add(sign);
        return div;
    }

}
